#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>

#define SEP " "
#define NUM 1024
#define SIZE 128

char command_line[NUM];
char* command_args[SIZE];
char env_buffer[NUM];

int ChangDir(const char* path)
{
  chdir(path);
  return 0;
}

void PutEnvInMyShell(char* new_env)
{
  putenv(new_env);
}



int main()
{
  while(1)
  {
  //不关心获取这些属性的接口
  //1、显示提示符
  printf("[lxm@主机名 当前目录]#");
  fflush(stdout);

  //2、获取用户输入
  memset(command_line,'\0',sizeof(command_line)*sizeof(char));
  fgets(command_line,NUM,stdin); //不能用scanf getline不知道行不行
  command_line[strlen(command_line)-1]='\0';
  //3、"ls -a -l" -> "ls" "-a" "-l"
  command_args[0]=strtok(command_line,SEP);
  int index = 1;
  //给ls加颜色
  if(strcmp(command_args[0],"ls")==0) command_args[index++] =(char*) "--color=auto";
  // = 是故意这么算的
  // strtok截取成功，返回字符串起始地址
  // 截取失败，返回NULL
  while(command_args[index++]=strtok(NULL,SEP));

  //4、TODO，编写后面的逻辑，内建命令
  if(strcmp(command_args[0],"cd")==0&&command_args[1]!=NULL)
  {
    ChangDir(command_args[1]);
    continue;
  }
  //导入环境变量
  if(strcmp(command_args[0],"export")==0&&command_args[1]!=NULL)
  {
    //目前，环境变量信息在command_line，会被清空
    //此处我们需要自己保存一下环境变量内容
    strcpy(env_buffer,command_args[1]);
    PutEnvInMyShell(env_buffer);
    continue;
  }

  //5、创建进程，执行
  pid_t id=fork();
  if(id==0)
  {
    //6、程序替换
    execvp(command_args[0],command_args);
    exit(1);//执行到这里 程序替换失败
  }
  int status=0;
  pid_t ret = waitpid(id,&status,0);
  if(ret>0)
  {
    printf("等待子程序成功，signal: %d ,code: %d\n",status&0x7F,(status>>8)&0xFF);
  }
  }
  return 0;
}
